/*
 * ==================================================================
 * Pardal - Framework for Classification Hierarchical and Multilabel.
 * ==================================================================
 * 
 * Copyright (C) 2013-2014 
 *  Valdigleis da Silva Costa
 *  Araken Medeiros Santos
 *  Daniel Sabino Amorim de Araujo
 *
 *  Departamento de Ciências Exatas, Tecnologicas e Humanas (DCETH) 
 *  Grupo de Inteligência Computacionais de Angicos (GICA)
 *  Campus Angicos (CA)
 *  Universidade Federal Rural do Semi-árido (UFERSA)
 *
 *  Project Info: (Site em desenvolvimento)
 * 
 * Framework Pardal is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * Framework Pardal is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 * 
 * ==================================================================
 * Pardal - Framework para Classificação Hierárquica e Multirrótulo.
 * ==================================================================
 * 
 * Copyright (C) 2013-2014 
 *  Valdigleis da Silva Costa
 *  Araken Medeiros Santos
 *  Daniel Sabino Amorim de Araujo
 *
 *  Departamento de Ciências Exatas, Tecnologicas e Humanas (DCETH) 
 *  Grupo de Inteligência Computacionais de Angicos (GICA)
 *  Campus Angicos (CA)
 *  Universidade Federal Rural do Semi-árido (UFERSA)
 *
 * Informações sobre o projeto: (Site em Desenvolvimento)
 * 
 * O Framework Pardal é um software livre; você pode redistribui-lo e/ou
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 2 da 
 * Licença, ou (na sua opnião) qualquer versão.
 * 
 * O Framework Pardal é distribuido na esperança que possa ser util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO
 * a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
 * Licença Pública Geral GNU para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package pardal.gica.gui.config.ensembles;

import java.text.ParseException;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE;
import javax.swing.text.MaskFormatter;
import pardal.gica.gui.HierarquicSelection;
import pardal.gica.gui.results.TextResult;
import weka.classifiers.trees.J48;
import weka.core.Instances;

/**
 * 
 * @author Valdigleis
 */
public class ConfigJ48 extends JDialog {
    
    //Tela Pai
    private HierarquicSelection father;
    //Instâncias
    private Instances instances;
    //int opção de execução
    private int Option;
    //Label para o campo de número mínimo de instancias por nó.
    private JLabel minIns;
    //Campo que guarda o valor mínimo de instancias por nó.
    private JFormattedTextField valueminIns;
    //Máscara para o campo do mínimo de instancias por nó.
    private MaskFormatter mask;
    //Lable para as Opções de poda ou não da árvore.
    private JLabel pruned;
    //Opção de poda
    private JComboBox optPruned;
    //Botão Ok
    private JButton ok;
    //Botão Cancelar
    private JButton cancel;
    //árvore
    private J48 tree;

    /**
     * Método construtor da classe ConfigJ48..
     * 
     * @param father - JFrame pai da Janela a ser gerada.
     * @param instances - Instâncias do problema a ser tratado pelo J48.
     * @param Option - Opção de Execução 1 - HMLP, 2 - HMC e 3 - HBR.
     */
    public ConfigJ48(HierarquicSelection father, Instances instances, int Option) throws ParseException {
        super(father);
        this.father = father;
        this.instances = instances;
        this.Option = Option;
        initComponents();
    }
    
    private void initComponents() throws ParseException{
        
        this.setTitle("Tree Decision - J48");
        this.setSize(330, 160);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setLayout(null);
        this.setModal(true);
        this.setResizable(false);
        
        this.minIns = new JLabel("Mínimo de instâncias por nó");
        this.minIns.setBounds(10, 5, 200, 25);
        
        this.valueminIns = new JFormattedTextField();
        this.valueminIns.setBounds(200, 5, 40, 25);
        this.valueminIns.setToolTipText("Valor mínimo de instâncias por nó da árvore.");
        
        this.mask = new MaskFormatter("#");
        this.mask.setValidCharacters("0123456789");
        this.mask.setCommitsOnValidEdit(true);
        this.mask.install(this.valueminIns);
        
        this.pruned = new JLabel("Usar Poda na árvore: ");
        this.pruned.setBounds(10, 40, 130, 25);
        
        this.optPruned = new JComboBox();
        this.optPruned.setToolTipText("Selecionar se a árvore será ou não podada.");
        this.optPruned.addItem("Sim");
        this.optPruned.addItem("Não");
        this.optPruned.setBounds(200, 40, 60, 25);
        
        this.ok = new JButton("OK");
        this.ok.setToolTipText("Confirmar configuração da árvore de decisão");
        this.ok.setBounds(50, 90, 100, 25);
        this.ok.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                try {
                     setTree();
                } catch (Exception ex) {
                    Logger.getLogger(ConfigJ48.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
                }
            }
        });
        
        this.cancel = new JButton("Cancelar");
        this.cancel.setToolTipText("Cancela a configuração da árvore de decisão");
        this.cancel.setBounds(170, 90, 100, 25);
        this.cancel.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                dispose();
            }
        });
        
        this.add(this.minIns);
        this.add(this.valueminIns);
        this.add(this.pruned);
        this.add(this.optPruned);
        this.add(this.ok);
        this.add(this.cancel);
        
        JLabel image = new JLabel();
        image.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pardal/resource/fundo.png")));
        image.setBounds(0, 0, 600, 400);
        this.add(image);
        
        this.setVisible(true);
    }
    
    private void setTree() throws ParseException, Exception{
        if(test()){
            boolean pruned = false;
            if(this.optPruned.getSelectedIndex() == 1){
                pruned = true;
            }
            if(this.Option == 1){
                this.tree = new J48();
                this.tree.setUnpruned(pruned);
                this.tree.setMinNumObj(Integer.parseInt(this.valueminIns.getText().trim()));
                this.setVisible(false);
            }
        }else{
            JOptionPane.showMessageDialog(father, "O valor minimo de objeto por nó deve ser preenchido.");
        }
    }
    
    private boolean test(){
        if(this.valueminIns.getText().trim().equals("")){
           return false;
       }else{
           return true;
       }
    }
    
    public J48 getTree(){
        return this.tree;
    }
}
